package job

import (
	"bbs-web/pkg/logger"
	"github.com/prometheus/client_golang/prometheus"
	"time"
)

//适配器模式是在不同接口之间进行适配,用另外的接口去封装一层接口，而装饰器模式是在相同接口的基础上动态地添加额外功能。

// 这里实现了的是corn Job的接口
type RankingJobAdapter struct {
	j    Job
	logx logger.Logger
	p    prometheus.Summary
}

func NewRankingJobAdapter(j Job, logx logger.Logger) *RankingJobAdapter {
	summary := prometheus.NewSummary(prometheus.SummaryOpts{
		Name:        "cron_job",
		ConstLabels: map[string]string{"name": j.Name()},
	})
	prometheus.MustRegister(summary)
	return &RankingJobAdapter{j: j, logx: logx}
}

func (r *RankingJobAdapter) Run() {
	start := time.Now()
	defer func() {
		since := time.Since(start).Milliseconds()
		r.p.Observe(float64(since))
	}()
	//使用自定义的热榜函数，就是这里使用了适配器模式
	err := r.j.Run()
	if err != nil {
		r.logx.Error("执行错误", logger.Error(err), logger.String("名字", r.j.Name()))
	}
}
